﻿using System;
using System.Collections.Generic;
using System.Text;
using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Security.Authorization;
using System.Data.Common;
using System.Data;

namespace Sinacor.Servico.Bovespa.Cliente.ResourceAccess
{
    public class GrupoAfinidade : BaseResourceAccess
    {
        #region Construtor

        /// <summary>
        /// Construtor padrão
        /// </summary>
        public GrupoAfinidade()
            : base(AuthorizationContext.Current.CompanyId)
        {
        }

        #endregion

        #region Metodos

        /// <summary>
        /// Consulta afinidades
        /// </summary>
        /// <param name="filtro"></param>
        /// <returns></returns>
        public List<BusinessEntity.GrupoAfinidade> ConsultarGruposAfinidades(BusinessEntity.Parameter.FiltroGrupoAfinidade filtro)
        {
            List<BusinessEntity.GrupoAfinidade> retorno = null;
            StringBuilder sql = new StringBuilder();
            string clausulaWhere = string.Empty;

            sql.Append(@"select
                            CD_AFINIDADE,
                            DS_AFINIDADE
                        from
                            tscafinidade {0}");

            if (filtro.Codigo != default(int))
            {
                clausulaWhere = " where CD_AFINIDADE = :Codigo ";
            }

            if (!string.IsNullOrEmpty(filtro.Descricao))
            {
                if(string.IsNullOrEmpty(clausulaWhere))
                    clausulaWhere = " where DS_AFINIDADE like '%' || :Descricao || '%' ";
                else
                    clausulaWhere += " and DS_AFINIDADE like '%' || :Descricao || '%' ";
            }


            using (DbCommand command = this.DataBase.GetSqlStringCommand(string.Format(sql.ToString(), clausulaWhere)))
            {
                if (filtro.Codigo != default(int))
                    this.DataBase.AddInParameter(command, "Codigo", DbType.Int32, filtro.Codigo);

                if (!string.IsNullOrEmpty(filtro.Descricao))
                    this.DataBase.AddInParameter(command, "Descricao", DbType.String, filtro.Descricao);
                

                retorno = this.FindAll<BusinessEntity.GrupoAfinidade>(command,
                   (
                       reader =>
                       {
                           BusinessEntity.GrupoAfinidade item = new BusinessEntity.GrupoAfinidade();

                           item.Codigo = reader.GetValue<Int32>("CD_AFINIDADE");
                           item.Descricao = reader.GetValue<String>("DS_AFINIDADE");

                           return item;
                       }
                   ));
            }

            return retorno;
        }

        #endregion
    }
}
